//服务端程序
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<ctype.h>
#include<unistd.h>

int main()
{
	//创建socket
	int lfd = socket(AF_INET,SOCK_STREAM,0);
	if(lfd<0)
	{
		perror("socket error");
		return -1;
	}	
	
	//绑定
	//创建结构体
	struct sockaddr_in serv;
	bzero(&serv,sizeof(serv));
	serv.sin_family = AF_INET;
	serv.sin_port = htons(6666);
	serv.sin_addr.s_addr = htonl(INADDR_ANY);//表示使用本地任意可用IP 
	int ret = bind(lfd,(struct sockaddr*)&serv,sizeof(serv));
	if(ret<0)
	{
		perror("bind error");
		return -1;
	}

	//监听 listen  主动变被动----》
	listen(lfd,128);

	//接收一个链接----阻塞
	//并不是新建立一个链接，而是从已经链接的队列中拿一个出来
	//int cfd = accept(lfd,NULL,NULL);
	//获取client端的IP和端口
	struct sockaddr_in client;
	socklen_t len = sizeof(client);	
	char SIP[16];
	memset(SIP,0,sizeof(SIP));
	int cfd = accept(lfd,(struct sockaddr*)&client,&len);//len是一个输入输出参数
	printf("client:IP==[%s],port==[%d]\n",inet_ntop(AF_INET,&client.sin_addr.s_addr,SIP,sizeof(SIP)),ntohs(client.sin_port));


	printf("lfd==[%d],cfd==[%d]\n",lfd,cfd);

	//接收数据
	int n = 0;
	char buf[1024];
	int i = 0;
	while(1)
	{
		memset(buf,0,sizeof(buf));
		int n = read(cfd,buf,sizeof(buf));
		if(n<=0)
		{
			printf("reed error or client close,n==[%d]\n",n);
			break;
		}
		printf("n==[%d],buf==[%s]\n",n,buf);
		//发送数据
		for(i = 0;i<n;i++)
		{
			buf[i] = toupper(buf[i]);
		}
		write(cfd,buf,n);
	}

	//关闭监听文件描述符和通信文件描述符
	close(lfd);
	close(cfd);
	return 0;
}
